﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using BusinessLogic;

namespace Presentation.contenido
{
    public partial class misTareas : System.Web.UI.Page
    {

        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                //Se carga El GridView con los tickets abiertos del Tecnico que esta logueado.
                gvPendientes.DataSource = Sistema.getInstancia().getSolicitudesByNroTec(long.Parse(Session["NroFunc"].ToString()));
                gvPendientes.DataBind();

                //Se hace invisible el view para los datos del ticket seleccionado.
                mvSelTicket.ActiveViewIndex = -1;

                //Se hace invisible el panel de los comentarios.
                pComentarios.Visible = false;

                //Se hace invisible el panel de las respuestas.
                pConRespuesta.Visible = false;

                //Se desabilitan los botones de Anterior y Siguiente de las respuestas.
                btnAnterior.Enabled = false;
                btnSiguiente.Enabled = false;
            }
        }

        protected void btnNuevoCom_Click(object sender, EventArgs e)
        {
            if (lblNroTicket.Text != "")
            {
                mvNuevoComentario.ActiveViewIndex = 1;
            }
        }

        protected void btnComentar_Click(object sender, EventArgs e)
        {
            if (lblNroTicket.Text != "")
            {
                //Se crea una nueva instancia de Mensaje.
                Mensaje unM = new Mensaje();
                //Se carga la instancia con el texto del textbox.
                unM.Texto = txtNuevoCom.Text;
                //Se inserta el nuevo mensaje y se le pasa el numero de solicitud como parametro.
                unM.insertMensaje(long.Parse(lblNroTicket.Text));
                //Se refresca la pagina para reflejar los cambios en las listas.
                Response.Redirect("misTareas.aspx");
            }
        }

        protected void btnCerrar_Click(object sender, EventArgs e)
        {
            mvCerrar.ActiveViewIndex = 1;
        }

        protected void gvPendientes_SelectedIndexChanged(object sender, EventArgs e)
        {
            //Se obtiene la solicitud correspondiente al numero de ticket seleccionado.
            Solicitud sol = Sistema.getInstancia().getSolicitudByNro(long.Parse(gvPendientes.SelectedRow.Cells[0].Text));
            //Se hace visible el view que contiene los datos del ticket seleccionado.
            mvSelTicket.ActiveViewIndex = 0;
            //Se asignan los valores del usuario que envio la solicitud obtenida al formulario.
            lblNro.Text = sol.UnUsuario.NroFuncionario.ToString();
            lblUsuario.Text = sol.UnUsuario.Nombre;
            lblSeccion.Text = sol.UnUsuario.Seccion;
            lblMailUsuario.Text = sol.UnUsuario.Mail;
            lblTelUsuario.Text = sol.UnUsuario.Telefono;
            lblInterno.Text = sol.UnUsuario.Interno;

            //Se asignan los valores de la solicitud obtenida al formulario.
            lblNroTicket.Text = sol.NroTicket.ToString();
            lblFechaCreado.Text = sol.Creada.ToShortDateString();
            lblFechaCerrado.Text = sol.Cerrada != null ? sol.Cerrada.ToShortDateString() : "Ninguna";
            lblEstado.Text = sol.Estado.ToString();
            lblTecnico.Text = sol.UnTecnico.Nombre;
            lblAsunto.Text = sol.Asunto;
            lblDesc.Text = sol.Descripcion;
            //Se cargan en la variable de session LstMensajes si los hay, los comentarios relacionados a la solicitud.
            Session["LstMens"] = sol.LstMensajes;
            //Si la lista de mensajes no esta vacia, se habilita el panel de comentarios,
            //Se limpia el formulario de comentarios y respuestas,
            //y se carga el panel con el mensaje mas reciente.
            if (Session["LstMens"] != null)
            {
                pComentarios.Visible = true;
                //Se carga la variable de session UnMens con el ultimo elemento de la lista de mensajes.
                Session["UnMens"] = ((List<Mensaje>)Session["LstMens"])[((List<Mensaje>)Session["LstMens"]).Count() - 1];
                fillFormComentarios();
            }
            
        }
        private void fillFormComentarios()
        {
            //Se limpia el formulario de comentarios y respuestas.
            limpiarForm();
            Mensaje unM = (Mensaje)Session["UnMens"];
            //Llena el formulario con los datos de un objeto Mensaje que se recibe como parametro.
            lblNumCom.Text = (((List<Mensaje>)Session["LstMens"]).Count() - ((List<Mensaje>)Session["LstMens"]).IndexOf(unM)).ToString();
            lblTotCom.Text = ((List<Mensaje>)Session["LstMens"]).Count().ToString();
            lblComFecha.Text = unM.Fecha.ToShortDateString();
            lblComentario.Text = unM.Texto;
            //Se habilitan o deshabilitan los botones de Anterior y Siguiente, segun la disponibilidad de mas comentarios.
            setEnabledSigAnt();
            //Se crea una lista de tipo respuesta y se intenta llenar con respuestas relacionadas con el mensaje.
            List<Respuesta> lstRespuestas = Respuesta.getRespuestaByNroMensaje(unM.Id);
            if(lstRespuestas != null)
            {
                fillFormRespuesta(lstRespuestas[0]);
            }
            else
            {
                //En caso de que no haya respuestas para el comentario actual, se hace invisible el panel pConRespuesta.
                pConRespuesta.Visible = false;
            }
        }

        private void fillFormRespuesta(Respuesta pRes)
        {
            //Se hace visible el panel de respuestas.
            pConRespuesta.Visible = true;
            //Llena el formulario de respuesta con los dato de un objeto Respuesta que recibe como parametro.
            lblResFecha.Text = pRes.Fecha.ToShortDateString();
            lblRespuesta.Text = pRes.Texto;
        }
        private void limpiarForm()
        {
            //Limpia el formulario de preguntas.
            lblNumCom.Text = "";
            lblTotCom.Text = "";
            lblComFecha.Text = "";
            lblComentario.Text = "";
            //Limpiar el formulario de respuestas.
            lblResFecha.Text = "";
            lblRespuesta.Text = "";
        }

        //Habilita o deshabilita los botones de anterior y siguiente.
        protected void setEnabledSigAnt()
        {
            //Se declara una lista de mensajes y se le asigna un parseo de la que se encuentra en la variable de session.
            List<Mensaje> lstMensajes = ((List<Mensaje>)Session["LstMens"]);
            Mensaje unMens = (Mensaje)Session["UnMens"];
            int indice = lstMensajes.IndexOf(unMens);
            //Si la lista de mensajes solo contiene un mensaje, se deshabilitan ambos botones.
            //RECORDAR QUE LA LISTA DE MENSAJES ESTA ORDENADA POR FECHA EN ORDEN DESCENDIENTE, POR LO QUE EL PRIMER ITEM DE LA LISTA
            //SERA EL MAS RECIENTE Y EL ULTIMO, EL MAS ANTIGUO.
            if(lstMensajes.Count() == 1)
            {
                //Si hay solo un comentario, se anulan ambos botones.
                btnSiguiente.Enabled = false;
                btnAnterior.Enabled = false;
            }
            else if(indice < (lstMensajes.Count() - 1) && indice > 0)
            {
                //Si existe tanto un anterior como un posterior, se habilitan ambos botones.
                btnAnterior.Enabled = true;
                btnSiguiente.Enabled = true;
            }
            else if(indice == (lstMensajes.Count() - 1))
            {
                btnAnterior.Enabled = true;
                btnSiguiente.Enabled = false;
            }
            else if(indice == 0 && lstMensajes.Count() > 1)
            {
                btnSiguiente.Enabled = true;
                btnAnterior.Enabled = false;
            }

        }
        protected void btnAnterior_Click(object sender, EventArgs e)
        {
            int indice = ((List<Mensaje>)Session["LstMens"]).IndexOf((Mensaje)Session["UnMens"]);
            //Se controla que haya un comentario anterior

            if (indice > 0)
            {
                //La lista de mensajes almacenada esta ordenada por fecha en orden descendente,
                //por lo que para ir a un comentario posterior se retrocede en vez de avanzar.
                Session["UnMens"] = ((List<Mensaje>)Session["LstMens"])[indice - 1];
                fillFormComentarios();
            }
        }

        protected void btnSiguiente_Click(object sender, EventArgs e)
        {
            int indice = ((List<Mensaje>)Session["LstMens"]).IndexOf((Mensaje)Session["UnMens"]);
            //Se controla que haya un comentario siguiente.
            if (indice < (((List<Mensaje>)Session["LstMens"]).Count() - 1))
            {
                //La lista de mensajes almacenada esta ordenada por fecha en orden descendente,
                //por lo que para ir a un comentario anterior se avanza en vez de retroceder.
                Session["UnMens"] = ((List<Mensaje>)Session["LstMens"])[indice + 1];
                fillFormComentarios();
            }

        }

        protected void btnCerrado_Click(object sender, EventArgs e)
        {
            if (lblNroTicket.Text != "")
            {
                //Se crea una nueva instancia de Mensaje.
                Mensaje unM = new Mensaje();
                //Se carga la instancia con el texto del textbox.
                unM.Texto = txtCerrar.Text;
                //Se inserta el nuevo mensaje y se le pasa el numero de solicitud como parametro.
                unM.insertMensaje(long.Parse(lblNroTicket.Text));
                //Se cambia el estado de la solicitud a Cerrado.
                Sistema.getInstancia().setEstadoSolicitud(enEstado.Cerrado, long.Parse(lblNroTicket.Text));
                //Se refresca la pagina para reflejar los cambios en las listas.
                Response.Redirect("misTareas.aspx");
            }
        }

    }
}